package com.design_pattern.singleton;

/**
 * 静态内部来的实现的单利模式
 * 1 实现懒加载
 * Java 类的加载过程包括：加载、验证、准备、解析、初始化。初始化阶段即执行类的 clinit 方法（clinit = class + initialize），
 * 包括为类的静态变量赋初始值和执行静态代码块中的内容。但不会立即加载内部类，内部类会在使用时才加载。所以当此 Singleton 类加载时，
 * SingletonHolder 并不会被立即加载，所以不会像饿汉式那样占用内存。
 *
 * 2 保证线程安全
 * Java 虚拟机的设计是非常稳定的，早已经考虑到了多线程并发执行的情况。虚拟机在加载类的 clinit 方法时，会保证 clinit 在多线程中被正确的
 * 加锁、同步。即使有多个线程同时去初始化一个类，一次也只有一个线程可以执行 clinit 方法，其他线程都需要阻塞等待，从而保证了线程安全
 */
public class SingletonD {
    private SingletonD() {

    }

    private static class SingletonHolder {
        public static SingletonD instance = new SingletonD();

    }

    public SingletonD getInstance() {
        return SingletonHolder.instance;
    }
}
